home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / plan / src / adjmenu.c next >
C/C++ Source or Header  |  1994-08-01  |  18KB  |  538 lines

  1. /*
  2.  * Create and destroy the time adjustment popup. It specidies a time offset,
  3.  * and timezone and daylight saving adjustment.
  4.  *
  5.  *    destroy_adjust_popup()
  6.  *    create_adjust_popup()
  7.  */
  8.  
  9. #ifndef MIPS
  10. #include <stdlib.h>
  11. #endif
  12. #include <stdio.h>
  13. #include <time.h>
  14. #include <Xm/Xm.h>
  15. #include <Xm/DialogS.h>
  16. #include <Xm/Form.h>
  17. #include <Xm/Frame.h>
  18. #include <Xm/RowColumn.h>
  19. #include <Xm/LabelP.h>
  20. #include <Xm/LabelG.h>
  21. #include <Xm/PushBP.h>
  22. #include <Xm/PushBG.h>
  23. #include <Xm/ToggleB.h>
  24. #include <Xm/Text.h>
  25. #include <Xm/Protocols.h>
  26. #include "cal.h"
  27.  
  28. extern void help_callback(), set_tzone();
  29. extern time_t parse_timestring(), get_time();
  30. extern char *mktimestring();
  31. static void done_callback(), guess_callback(),
  32.         adjust_callback(), dst_callback();
  33.  
  34. extern Display        *display;    /* everybody uses the same server */
  35. extern struct edit    edit;        /* info about entry being edited */
  36. extern struct config    config;        /* global configuration data */
  37. extern XtAppContext    app;        /* application handle */
  38. extern struct mainmenu    mainmenu;    /* all important main window widgets */
  39. extern Pixel        color[NCOLS];    /* colors: COL_* */
  40. extern XFontStruct    *font[NFONTS];    /* fonts: FONT_* */
  41. extern struct list    *mainlist;    /* list of all schedule entries */
  42.  
  43. static BOOL        have_shell;    /* message popup exists if TRUE */
  44. static Widget        shell;        /* popup menu shell */
  45. static XtIntervalId    timer_id;    /* identifies 1-second timer */
  46. static Widget        time_w;        /* current time display */
  47. static Widget        adjust_w;    /* time adjustment text widget */
  48. static Widget        tzone_w;    /* timezone text widget */
  49. static Widget        toggle0_w;    /* top radio button for dst on */
  50. static Widget        toggle1_w;    /* middle radio button for dst off */
  51. static Widget        toggle2_w;    /* bottom radio button for auto dst */
  52. static Widget        begin_w;    /* daylight saving begin text widget */
  53. static Widget        end_w;        /* daylight saving end text widget */
  54.  
  55.  
  56. /*
  57.  * print current time, once a second and when a button is pressed
  58.  */
  59.  
  60. static print_times()
  61. {
  62.     int            hour, min, sec;
  63.  
  64.     sec = get_time();
  65.     if (config.smallmonth)
  66.         print_button(mainmenu.time,    mktimestring(sec, FALSE));
  67.     else
  68.         print_button(mainmenu.time, "%s   %s",
  69.                         mkdatestring(sec, FALSE),
  70.                         mktimestring(sec, FALSE));
  71.     hour = sec / 3600;
  72.     min  = (sec / 60) % 60;
  73.     sec %= 60;
  74.     set_tzone();
  75.     print_icon_name();
  76.     if (config.ampm)
  77.         print_button(time_w, "%2d:%02d:%02d%c", hour%12 ? hour%12 : 12,
  78.                         min, sec, "ap"[hour >= 12]);
  79.     else
  80.         print_button(time_w, "%02d:%02d:%02d", hour, min, sec);
  81. }
  82.  
  83. /*ARGSUSED*/
  84. static void sec_timer_callback(data, id)
  85.     XtPointer        data;        /* not used */
  86.     XtIntervalId        *id;        /* not used */
  87. {
  88.     if (have_shell) {
  89.         print_times();
  90.         timer_id = XtAppAddTimeOut(app, 1000, sec_timer_callback, 0);
  91.     }
  92. }
  93.  
  94.  
  95. /*
  96.  * print text into all text widgets
  97.  */
  98.  
  99. static void print_text_buttons()
  100. {
  101.     Arg            args;
  102.     time_t            t;
  103.  
  104.     t = config.adjust_time < 0 ? -config.adjust_time : config.adjust_time;
  105.     print_text_button(adjust_w, "%c %d:%02d:%02d",
  106.                 config.adjust_time < 0 ? '-' : '+',
  107.                 t/3600, (t/60)%60, t%60);
  108.  
  109.     t = config.raw_tzone < 0 ? -config.raw_tzone : config.raw_tzone;
  110.     print_text_button(tzone_w, "%c %d:%02d",
  111.                 config.raw_tzone < 0 ? '-' : '+',
  112.                 t/3600, (t/60)%60);
  113.  
  114.     if (config.dst_flag == 2) {
  115.         print_text_button(begin_w, "%d", config.dst_begin);
  116.         print_text_button(end_w,   "%d", config.dst_end);
  117.         XtSetArg(args, XmNsensitive, TRUE);
  118.     } else {
  119.         print_text_button(begin_w, "");
  120.         print_text_button(end_w,   "");
  121.         XtSetArg(args, XmNsensitive, FALSE);
  122.     }
  123.     XtSetValues(begin_w, &args, 1);
  124.     XtSetValues(end_w,   &args, 1);
  125. }
  126.  
  127.  
  128. /*
  129.  * retrieve texts from text widgets, store everything in config
  130.  */
  131.  
  132. static void eval_menu_texts()
  133. {
  134.     char        *string;    /* contents of text widget */
  135.  
  136.     string = XmTextGetString(adjust_w);
  137.     config.adjust_time = *string == '+' ?  parse_timestring(string+1) :
  138.                  *string == '-' ? -parse_timestring(string+1)
  139.                         :  parse_timestring(string);
  140.     XtFree(string);
  141.  
  142.     string = XmTextGetString(tzone_w);
  143.     config.raw_tzone   = *string == '+' ?  parse_timestring(string+1) :
  144.                  *string == '-' ? -parse_timestring(string+1)
  145.                         :  parse_timestring(string);
  146.     XtFree(string);
  147.  
  148.     string = XmTextGetString(begin_w);
  149.     config.dst_begin = atoi(string);
  150.     XtFree(string);
  151.  
  152.     string = XmTextGetString(end_w);
  153.     config.dst_end = atoi(string);
  154.     XtFree(string);
  155.  
  156.     set_tzone();
  157. }
  158.  
  159.  
  160. /*
  161.  * destroy a popup. Remove it from the screen, and destroy its widgets.
  162.  * It's too much trouble to keep them for next time.
  163.  */
  164.  
  165. destroy_adjust_popup()
  166. {
  167.     if (have_shell) {
  168.         eval_menu_texts();
  169.         XtPopdown(shell);
  170.         XTDESTROYWIDGET(shell);
  171.         have_shell = FALSE;
  172.         mainlist->modified = TRUE;
  173.     }
  174. }
  175.  
  176.  
  177. /*
  178.  * create an adjust popup as a separate application shell. The popup is
  179.  * initialized with data from config.
  180.  */
  181.  
  182. create_adjust_popup()
  183. {
  184.     Widget            form, frame, form2, form3, radio, w, w2;
  185.     Arg            args[20];
  186.     int            n;
  187.     Atom            closewindow;
  188.  
  189.     destroy_adjust_popup();
  190.  
  191.     n = 0;
  192.     XtSetArg(args[n], XmNdeleteResponse,    XmDO_NOTHING);        n++;
  193.     XtSetArg(args[n], XmNiconic,        False);            n++;
  194.     shell = XtAppCreateShell("Adjust Time", "plan",
  195.             applicationShellWidgetClass, display, args, n);
  196. #    ifdef EDITRES
  197.     XtAddEventHandler(shell, (EventMask)0, TRUE, 
  198.              _XEditResCheckMessages, NULL);
  199. #    endif
  200.     set_icon(shell, 1);
  201.     form = XtCreateManagedWidget("adjform1", xmFormWidgetClass,
  202.             shell, NULL, 0);
  203.     XtAddCallback(form, XmNhelpCallback,help_callback,(XtPointer)"adj");
  204.  
  205.                             /*-- current time --*/
  206.     n = 0;
  207.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  208.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  209.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  210.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  211.     time_w = XtCreateManagedWidget(" ", xmLabelWidgetClass,
  212.             form, args, n);
  213.                             /*-- adjust time --*/
  214.     n = 0;
  215.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  216.     XtSetArg(args[n], XmNtopWidget,        time_w);        n++;
  217.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  218.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  219.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  220.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  221.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  222.     XtSetArg(args[n], XmNshadowType,    XmSHADOW_ETCHED_IN);    n++;
  223.     frame = XtCreateManagedWidget("", xmFrameWidgetClass,
  224.             form, args, n);
  225.     form2 = XtCreateManagedWidget("adjform2", xmFormWidgetClass,
  226.             frame, NULL, 0);
  227.     XtAddCallback(form2, XmNhelpCallback, help_callback,
  228.                             (XtPointer)"adj_time");
  229.     n = 0;
  230.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  231.     XtSetArg(args[n], XmNtopOffset,        12);            n++;
  232.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  233.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  234.     w = XtCreateManagedWidget("Add", xmLabelWidgetClass,
  235.             form2, args, n);
  236.     n = 0;
  237.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  238.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  239.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  240.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  241.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  242.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  243.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  244.     XtSetArg(args[n], XmNwidth,        140);            n++;
  245.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  246.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  247.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  248.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  249.     adjust_w = XtCreateManagedWidget("", xmTextWidgetClass,
  250.             form2, args, n);
  251.     XtAddCallback(adjust_w, XmNactivateCallback, adjust_callback,
  252.                             (XtPointer)NULL);
  253.     n = 0;
  254.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  255.     XtSetArg(args[n], XmNtopOffset,        12);            n++;
  256.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  257.     XtSetArg(args[n], XmNleftWidget,    adjust_w);        n++;
  258.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  259.     w = XtCreateManagedWidget("(h:m:s) to system time", xmLabelWidgetClass,
  260.             form2, args, n);
  261.                             /*-- adjust tzone --*/
  262.     n = 0;
  263.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  264.     XtSetArg(args[n], XmNtopWidget,        frame);            n++;
  265.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  266.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  267.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  268.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  269.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  270.     XtSetArg(args[n], XmNshadowType,    XmSHADOW_ETCHED_IN);    n++;
  271.     frame = XtCreateManagedWidget("", xmFrameWidgetClass,
  272.             form, args, n);
  273.     form2 = XtCreateManagedWidget("adjform3", xmFormWidgetClass,
  274.             frame, NULL, 0);
  275.     XtAddCallback(form2, XmNhelpCallback, help_callback,
  276.                             (XtPointer)"adj_dst");
  277.  
  278.     n = 0;
  279.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  280.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  281.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  282.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  283.     w2 = XtCreateManagedWidget("Timezone is GMT", xmLabelWidgetClass,
  284.             form2, args, n);
  285.     XtAddCallback(w2, XmNhelpCallback,help_callback,(XtPointer)"adj_zone");
  286.  
  287.     n = 0;
  288.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  289.     XtSetArg(args[n], XmNtopOffset,        4);            n++;
  290.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  291.     XtSetArg(args[n], XmNleftWidget,    w2);            n++;
  292.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  293.     XtSetArg(args[n], XmNwidth,        100);            n++;
  294.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  295.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  296.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  297.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  298.     tzone_w = XtCreateManagedWidget("", xmTextWidgetClass,
  299.             form2, args, n);
  300.     XtAddCallback(tzone_w, XmNactivateCallback, adjust_callback,
  301.                             (XtPointer)NULL);
  302.     n = 0;
  303.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  304.     XtSetArg(args[n], XmNtopOffset,        8);            n++;
  305.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  306.     XtSetArg(args[n], XmNleftWidget,    tzone_w);        n++;
  307.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  308.     w = XtCreateManagedWidget("(h:m)", xmLabelWidgetClass,
  309.             form2, args, n);
  310.                             /*-- dst radio --*/
  311.     n = 0;
  312.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  313.     XtSetArg(args[n], XmNtopWidget,        w2);            n++;
  314.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  315.     form3 = XtCreateManagedWidget("adjform2", xmFormWidgetClass,
  316.             form2, args, n);
  317.     n = 0;
  318.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  319.     XtSetArg(args[n], XmNtopOffset,        24);            n++;
  320.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  321.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  322.     w = XtCreateManagedWidget("Daylight Saving is", xmLabelWidgetClass,
  323.             form3, args, n);
  324.  
  325.     n = 0;
  326.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  327.     XtSetArg(args[n], XmNtopOffset,        20);            n++;
  328.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  329.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  330.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  331.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  332.     XtSetArg(args[n], XmNspacing,        4);            n++;
  333.     radio = XmCreateRadioBox(form3, "radio", args, n);
  334.  
  335.     n = 0;
  336.     XtSetArg(args[n], XmNindicatorType,    XmONE_OF_MANY);        n++;
  337.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  338.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  339.     XtSetArg(args[n], XmNset,        config.dst_flag==0);    n++;
  340.     toggle0_w = XtCreateManagedWidget("always on",
  341.             xmToggleButtonWidgetClass,
  342.             radio, args, n);
  343.     XtAddCallback(toggle0_w, XmNvalueChangedCallback, dst_callback,
  344.                                 (XtPointer)0);
  345.     n = 0;
  346.     XtSetArg(args[n], XmNindicatorType,    XmONE_OF_MANY);        n++;
  347.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  348.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  349.     XtSetArg(args[n], XmNset,        config.dst_flag==1);    n++;
  350.     toggle1_w = XtCreateManagedWidget("always off",
  351.             xmToggleButtonWidgetClass,
  352.             radio, args, n);
  353.     XtAddCallback(toggle1_w, XmNvalueChangedCallback, dst_callback,
  354.                                 (XtPointer)1);
  355.     n = 0;
  356.     XtSetArg(args[n], XmNindicatorType,    XmONE_OF_MANY);        n++;
  357.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  358.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  359.     XtSetArg(args[n], XmNset,        config.dst_flag==2);    n++;
  360.     toggle2_w = XtCreateManagedWidget("automatic",
  361.             xmToggleButtonWidgetClass,
  362.             radio, args, n);
  363.     XtAddCallback(toggle2_w, XmNvalueChangedCallback, dst_callback,
  364.                                 (XtPointer)2);
  365.  
  366.                             /*-- dst day range --*/
  367.     n = 0;
  368.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  369.     XtSetArg(args[n], XmNtopWidget,        form3);            n++;
  370.     XtSetArg(args[n], XmNtopOffset,        24);            n++;
  371.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  372.     XtSetArg(args[n], XmNleftOffset,    8);            n++;
  373.     w = XtCreateManagedWidget("Automatic DST from Julian day",
  374.             xmLabelWidgetClass,
  375.             form2, args, n);
  376.  
  377.     n = 0;
  378.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  379.     XtSetArg(args[n], XmNtopWidget,        form3);            n++;
  380.     XtSetArg(args[n], XmNtopOffset,        20);            n++;
  381.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  382.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  383.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  384.     XtSetArg(args[n], XmNwidth,        60);            n++;
  385.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  386.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  387.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  388.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  389.     begin_w = XtCreateManagedWidget("", xmTextWidgetClass,
  390.             form2, args, n);
  391.     XtAddCallback(begin_w, XmNactivateCallback, adjust_callback,
  392.                             (XtPointer)NULL);
  393.     n = 0;
  394.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  395.     XtSetArg(args[n], XmNtopWidget,        form3);            n++;
  396.     XtSetArg(args[n], XmNtopOffset,        24);            n++;
  397.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  398.     XtSetArg(args[n], XmNleftWidget,    begin_w);        n++;
  399.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  400.     w = XtCreateManagedWidget("to", xmLabelWidgetClass,
  401.             form2, args, n);
  402.     n = 0;
  403.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  404.     XtSetArg(args[n], XmNtopWidget,        form3);            n++;
  405.     XtSetArg(args[n], XmNtopOffset,        20);            n++;
  406.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  407.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  408.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  409.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  410.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  411.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  412.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  413.     XtSetArg(args[n], XmNwidth,        60);            n++;
  414.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  415.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  416.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  417.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  418.     end_w = XtCreateManagedWidget("", xmTextWidgetClass,
  419.             form2, args, n);
  420.     XtAddCallback(end_w, XmNactivateCallback, adjust_callback,
  421.                             (XtPointer)NULL);
  422.  
  423.                             /*-- buttons --*/
  424.     n = 0;
  425.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  426.     XtSetArg(args[n], XmNtopWidget,        frame);            n++;
  427.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  428.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  429.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  430.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  431.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  432.     XtSetArg(args[n], XmNwidth,        80);            n++;
  433.     w = XtCreateManagedWidget("Done", xmPushButtonWidgetClass,
  434.             form, args, n);
  435.     XtAddCallback(w, XmNactivateCallback, done_callback, (XtPointer)0);
  436.     XtAddCallback(w, XmNhelpCallback, help_callback,(XtPointer)"adj_done");
  437.  
  438.     n = 0;
  439.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  440.     XtSetArg(args[n], XmNtopWidget,        frame);            n++;
  441.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  442.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  443.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  444.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  445.     XtSetArg(args[n], XmNrightWidget,    w);            n++;
  446.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  447.     XtSetArg(args[n], XmNwidth,        80);            n++;
  448.     w = XtCreateManagedWidget("Help", xmPushButtonWidgetClass,
  449.             form, args, n);
  450.     XtAddCallback(w, XmNactivateCallback, help_callback, (XtPointer)"adj");
  451.     XtAddCallback(w, XmNhelpCallback,     help_callback, (XtPointer)"adj");
  452.  
  453.     n = 0;
  454.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  455.     XtSetArg(args[n], XmNtopWidget,        frame);            n++;
  456.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  457.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  458.     XtSetArg(args[n], XmNbottomOffset,    8);            n++;
  459.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  460.     XtSetArg(args[n], XmNrightWidget,    w);            n++;
  461.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  462.     XtSetArg(args[n], XmNwidth,        80);            n++;
  463.     w = XtCreateManagedWidget("Guess", xmPushButtonWidgetClass,
  464.             form, args, n);
  465.     XtAddCallback(w, XmNactivateCallback, guess_callback, (XtPointer)0);
  466.     XtAddCallback(w, XmNhelpCallback,help_callback,(XtPointer)"adj_guess");
  467.  
  468.     XtManageChild(radio);
  469.     XtPopup(shell, XtGrabNone);
  470.     print_text_buttons();
  471.     print_times();
  472.  
  473.     closewindow = XmInternAtom(display, "WM_DELETE_WINDOW", False);
  474.     XmAddWMProtocolCallback(shell, closewindow,
  475.                     done_callback, (XtPointer)shell);
  476.     have_shell = TRUE;
  477.     timer_id = XtAppAddTimeOut(app, 1000, sec_timer_callback, 0);
  478. }
  479.  
  480.  
  481. /*-------------------------------------------------- callbacks --------------*/
  482. /*
  483.  * All of these routines are direct X callbacks.
  484.  */
  485.  
  486. /*ARGSUSED*/
  487. static void done_callback(widget, item, data)
  488.     Widget                widget;
  489.     int                item;
  490.     XmToggleButtonCallbackStruct    *data;
  491. {
  492.     destroy_adjust_popup();
  493. }
  494.  
  495.  
  496. /*ARGSUSED*/
  497. static void guess_callback(widget, item, data)
  498.     Widget                widget;
  499.     int                item;
  500.     XmToggleButtonCallbackStruct    *data;
  501. {
  502.     Arg                args;
  503.  
  504.     guess_tzone();
  505.     set_tzone();
  506.     XtSetArg(args, XmNset, FALSE);
  507.     XtSetValues(toggle0_w, &args, 1);
  508.     XtSetValues(toggle1_w, &args, 1);
  509.     XtSetArg(args, XmNset, TRUE);
  510.     XtSetValues(toggle2_w, &args, 1);
  511.     print_text_buttons();
  512.     print_times();
  513. }
  514.  
  515.  
  516. /*ARGSUSED*/
  517. static void dst_callback(widget, item, data)
  518.     Widget                widget;
  519.     int                item;
  520.     XmToggleButtonCallbackStruct    *data;
  521. {
  522.     config.dst_flag = item;
  523.     print_text_buttons();
  524.     print_times();
  525. }
  526.  
  527.  
  528. /*ARGSUSED*/
  529. static void adjust_callback(widget, item, data)
  530.     Widget                widget;
  531.     int                item;
  532.     XmToggleButtonCallbackStruct    *data;
  533. {
  534.     eval_menu_texts();
  535.     print_text_buttons();
  536.     print_times();
  537. }
  538.